Cap. 5 Trabalho final
Impacto da taxa Selic no índice Bovespa
5.1 Introdução
Após a regulamentação do Anexo IV e da implementação do Plano Real, o mercado acionário brasileiro teve um grande salto no seu desenvolvimento, tanto em termos de volume dos negócios quanto na eficiência alocativa… A grande conquista do Plano Real foi o controle da inflação. Taxas de inflação em níveis aceitáveis foram e estão sendo mantidas sob controle, devido às constantes intervenções governamentais, aumentando ou reduzindo as taxas de juros, tanto as de curto quanto as de longo prazo, controlando a oferta monetária através dos depósitos compulsórios sobre depósitos à vista, bem como controlando a taxa de câmbio, instrumento utilizado pelo BACEN por um longo período. Há, portanto, por parte de todos os agentes, a necessidade de se conhecer como o mercado acionário responde às mudanças dessas variáveis macroeconômicas. (DE SOUZA GRÔPPO, 2005)
Para os participantes do mercado financeiro, há um interesse dada a influência exercida pela política monetária sobre os mercados, conhecer tais estimativas representaria uma relevante informação para a construção de posições e estratégias, tanto de investimento, bem como para a gestão dos riscos implícitos às operações normalmente desenvolvidas em seu dia-a-dia. (GONÇALVES JUNIOR, 2007)
De acordo com o conhecimento convencional, mudanças nas taxas de juros afetariam o custo de capital e as expectativas futuras quanto à lucratividade das empresas, impactando portanto sua geração de dividendos ao acionista, especialmente se considerada a valores presentes; em última análise, isto repercute no valor de mercado atual da empresa, e portanto de suas ações em Bolsa. (GONÇALVES JUNIOR, 2007)
Porém, a atividade econômica também exerce efeito importante sobre a determinação dos preços na Bolsa de Valores, particularmente no Ibovespa. Os preços das ações são positivamente relacionados com a atividade econômica, medida pelo nível de produção industrial. A política monetária possui efeito significativo sobre a produção industrial o que indicaria a existência do segundo canal pelo qual a política monetária afeta os preços das ações.(DOS SANTOS et al., 2006)
5.2 Objetivo
O objetivo é mensurar e analisar as respostas do mercado acionário às decisões do Comitê de Política Monetária do Banco Central do Brasil (COPOM) em relação à taxa básica de juro, verificando o comportamento do índice agregado da Bolsa de Valores de São Paulo (Bovespa).
5.3 Problema
Quantificar ou prever a influência da taxa selic no índice Bovespa demanda modelos de predições dinâmicas.
A modelagem prevê predizer o Indice Bovespa (serie temporal em base diária) em função das covariáveis (taxa Selic anunciada mês a mês).
Pressupõe-se que cortes não previstos na taxa de juros Selic proporcionem uma valorização das ações, já que abriria espaço para expansão da economia, com aumentos dos lucros e dos dividendos distribuídos pelas empresas.
Mercados eficientes antecipam as decisões do COPOM, o que não deveria sensibilizar o índice bovespa, uma vez que que as mudanças já foram incorporadas ao valor das ações, no entando, as surpresas, a diferença da expectativa e da decisão, deveriam causar uma resposta do índice. O estudo define uma medida que procura captar a surpresa gerada nos mercados. As medidas foram baseadas em dados do mercado de futuros DI 1 dia, pela sua similaridade à taxa SELIC. (GONÇALVES JUNIOR, 2007)
5.4 Metodologia
A meta para a taxa básica de juro, inicialmente referida como TBC, teve sua sistemática alterada em agosto de 1998, quando o Banco Central passou a fazer uso também da TBAN (taxa de assistência para redesconto bancário), ofertando e tomando recursos na banda assim definida, conforme necessidades, importância, garantia e riscos dos agentes envolvidos, aplicando-se também um sistema de quotas instituído na ocasião. Em 05/03/1999, a TBC foi extinta, tendo sido substituída pela SELIC para fins de política monetária, passando-se a empregar esta última como a taxa básica de juro e principal instrumento das operações de mercado aberto. (GONÇALVES JUNIOR, 2007)
O índice Bovespa (ou simplesmente Ibovespa) foi criado há mais de cinquenta anos, em 2 de janeiro de 1968. Antes do Ibovespa, os preços das ações negociadas na Bolsa de Valores de São Paulo (SPSE) eram divulgados por meio de boletim diário (Boletim Diário de Informação – BDI). (CASTRO et al., 2019)
De modo geral, os mercados financeiros são forward looking, o que equivale a dizer que eles estão constantemente incorporando novas informações a seus preços, seja devido a fatos que impactam imediatamente suas operações, seja por razões que modificam expectativas sobre o futuro; é a constatação de que estes agentes são racionais, utilizando toda a informação disponível para realizar suas previsões, tomando valores passados e correntes de variáveis exógenas ou não (LUCAS et al., 1996).
Cada decisão tomada pelo COPOM é estudada por esses agentes, que antecipam em alguma medida seus resultados; assim sendo, quaisquer mudanças observadas nas variáveis correntes e futuras através do tempo decorrerão exclusivamente de mudanças não antecipadas. (CASTRO et al., 2019)
Conseqüentemente, analisar-se a relação direta entre as variações na meta da taxa de juro e as do Índice Bovespa pode mostrar baixa significância entre as variáveis; de fato, se os mercados inevitavelmente não gerarão respostas a mudanças já esperadas, então é preciso distinguir na variação da meta suas componentes antecipada e não antecipada. É o que proporemos a seguir. (CASTRO et al., 2019)
Após apresentação da evolução do índice ibovespa, taxa selic foi calculado o efeito da decisão do COPOM no índice bovespa num período de dez dias antes de depois da decisão e qual foi o retorno para o período.
Em seguida, foi calculado o coeficiente de correlação linear de Pearson entre o índice bovespa e a taxa selic para toda a série e para quatro períodos distintos:
- de 2004 a 2007: período de início da redução de juros até a crise dos Subprime,
- de 2008 a 2010: do auge da crise financeira mundial no Brasil até a fase de recuperação do mercado;
- de 2011 a 2012: período que inclui tendência de redução da taxa básica de juros e a crise financeira, iniciada na Europa em 2011.
- de 2013 a 2016: período da crise econômica de 2014, conhecida como a “grande recessão brasileira”, foi uma profunda e duradoura crise econômica, sendo caracterizada por recessão por dois anos consecutivos (2015 e 2016) e por sua longa e lenta recuperação, a mais lenta da história do país. (WIKIPEDIA, 2022)
- de 2017 a 2022: período que incluem os efeitos da COVID-19, iniciada em 2020.
Os dados utilizados neste trabalho foram obtidos de banco de dados, índices e relatórios contidos em sites como da BM&F BOVESPA, BACEN e CVM, além de informações coletadas da literatura indicada.
A análise de correlação será feita utilizando o coeficiente de Pearson que varia de -1 a 1, sendo que o sinal indica a direção, positiva ou negativa, da relação e o valor sugere a força do relacionamento entre as variáveis.
A condução do trabalhe segue os seguintes passos:
Figura 1: Roteiro
Fonte: (YOSHIDA, 2022)
5.4.1 Estimando a Surpresa dos Mercados
Para estimar a surpresa dos mercados, foi utilizado o conjunto de dados da pesquisa Focus que diariamente registra a expectativa do mercado em relação a alguns indicadores macroeconomicos, entre eles a Selic.
Foi considerado que:
Sendo:
- \(S_t\): surpresa na reunião
- \(d_t\): decisão do copom sobre o valor da taxa Selic
- \(m_t\): valor máximo informado pelos respondentes como expectativa para o valor da taxa Selic
Temos que:
\(s_t = d_t - m_t\)
Sempre que \(s_t\) é negativo, o mercado esperava um valor menor do que o decidido pelo COPOM e vice-versa.
# Limpando as variáveis do ambiente
rm(list = ls())Pacotes utilizados neste trabalho:
library(quantmod)
library(xts)
library(sidrar)
library(timetk)
library(tidyverse)
library(jsonlite)
library(ggplot2)
library(scales)
library(BatchGetSymbols)
library(dplyr)
library(rb3)
library(pastecs)
library(ggpubr)
library(bizdays)
library(gridExtra)
library(GGally)
library(readxl)
library(ggformula)
#conflicts(detail = TRUE)5.5 Índice IBOVESPA
Dados obtidos pela biblioteca BatchGetSymbols que utiliza o Yahoo Finance como fonte de dados.
first_date = as.Date('2001-12-19') # data reunião 66 do COPOM
last_date = as.Date('2022-11-25')
eval_period = last_date - first_date
df_bvsp = BatchGetSymbols('^BVSP', first.date = first_date,
last.date = last_date)O período de análise será de 20 anos, de 2001-12-19 até 2022-11-25.
O comportamento do índice bovespa neste período foi:
bov_plot <- ggplot(df_bvsp$df.tickers, aes(x = ref.date, y = price.adjusted)) +
geom_line() +
scale_y_discrete(limits=c(10000, 20000, 30000, 40000, 50000, 60000,
70000, 80000, 90000, 100000, 110000, 120000, 130000)) +
scale_x_date(breaks = date_breaks("1 years"),
labels = date_format("%Y")) +
xlab('')+ylab('Pontos') +
labs(title='Índice Bovespa',
caption='Fonte: Yahoo Finance.') +
geom_line() +
geom_smooth(method = "loess", se = FALSE) +
scale_y_continuous(labels = label_comma()) +
theme(axis.text.x = element_text(angle = 90)
)5.6 Indicador SELIC
A meta da taxa SELIC diária. Conjunto de dados obtido pela opção de download do gráfico.
df_selic_meta <- read.csv2(file = "../dados/selic-bcb-2022-12-11.csv",
sep=";", dec=",",
colClasses = c("character", "numeric"),
col.names = c("ref.date", "selic.tax"))
df_selic_meta <- transform(df_selic_meta, ref.date = as.Date(ref.date,'%Y-%m-%d'))
df_selic_meta <- na.omit(df_selic_meta) %>%
filter(ref.date >= first_date)
tail(df_selic_meta)## ref.date selic.tax
## 3648 2022-12-06 13.75
## 3649 2022-12-07 13.75
## 3650 2022-12-08 13.75
## 3651 2022-12-09 13.75
## 3652 2022-12-10 13.75
## 3653 2022-12-11 13.75
O nome do arquivo indica a data da última extração.
E o comportamento no período foi:
selic_plot <- ggplot(df_selic_meta, aes(x = ref.date, y = selic.tax)) +
geom_line() +
scale_x_date(breaks = date_breaks("1 years"),
labels = date_format("%Y")) +
xlab('')+ylab('%') +
labs(title='Meta taxa selic',
caption='Fonte: Banco Central do Brasil.') +
geom_line() +
geom_smooth(method = "loess", se = FALSE) +
scale_y_continuous(labels = label_comma()) +
theme(axis.text.x = element_text(angle = 90))5.7 Pesquisa Focus
O Relatório Focus resume as estatísticas calculadas considerando as expectativas de mercado coletadas até a sexta-feira anterior à sua divulgação. Ele é divulgado toda segunda-feira. O relatório traz a evolução gráfica e o comportamento semanal das projeções para índices de preços, atividade econômica, câmbio, taxa Selic, entre outros indicadores. As projeções são do mercado, não do Banco Central. BC - Focus.
Esse conjunto de dados é o resultado da pesquisa diária das expectativas para a taxa selic. Os respondentes são cerca de 120 bancos, gestores de recursos e demais instituições (empresas do setor real, distribuidoras, corretoras, consultorias e outras).
As expectativas são expressadas na forma do mínimo e do máximo esperado.
df_selic_focus = rbcb::get_market_expectations("annual", "Selic",start_date = "2002-01-01", end_date = "2022-12-31")
df_selic_focus <- df_selic_focus %>%
dplyr::select(Data, DataReferencia, Minimo, Maximo, numeroRespondentes) %>%
filter(format(Data, "%Y") == DataReferencia)
names(df_selic_focus)[1] = "ref.date"
names(df_selic_focus)[2] = "ref.year"
names(df_selic_focus)[3] = "min"
names(df_selic_focus)[4] = "max"
names(df_selic_focus)[5] = "respondents"
tail(df_selic_focus)## # A tibble: 6 × 5
## ref.date ref.year min max respondents
## <date> <chr> <dbl> <dbl> <int>
## 1 2022-11-30 2022 13.8 14 131
## 2 2022-11-30 2022 13.8 13.8 45
## 3 2022-12-01 2022 13.8 14 131
## 4 2022-12-01 2022 13.8 13.8 44
## 5 2022-12-02 2022 13.8 14 131
## 6 2022-12-02 2022 13.8 13.8 82
5.8 Reuniões COPOM
Este conjunto de dados foi preparado pelo autor utilizando a fonte de dados Taxas de juros básicas – Histórico do Banco Central que contém todas as datas das reuniões do COPOM, bem como a meta decidida.
df_reuniao_copom <- read_excel("../dados/reunioes-copom-2022.xlsx")
df_reuniao_copom <- df_reuniao_copom %>%
dplyr::select(reuniao_n, extraordinaria, reuniao_data, nota, vigencia_inicio, vigencia_fim, meta_selic_ano)
df_reuniao_copom$reuniao_data = as.Date(df_reuniao_copom$reuniao_data)
df_reuniao_copom$vigencia_inicio = as.Date(df_reuniao_copom$vigencia_inicio)
df_reuniao_copom$vigencia_fim = as.Date(df_reuniao_copom$vigencia_fim)
names(df_reuniao_copom)[1] = "meeting.number"
names(df_reuniao_copom)[2] = "extra"
names(df_reuniao_copom)[3] = "ref.date"
names(df_reuniao_copom)[4] = "note"
names(df_reuniao_copom)[5] = "term.start"
names(df_reuniao_copom)[6] = "term.end"
names(df_reuniao_copom)[7] = "decision.target"
head(df_reuniao_copom)## # A tibble: 6 × 7
## meeting.number extra ref.date note term.start term.end decision.target
## <dbl> <dbl> <date> <chr> <date> <date> <dbl>
## 1 1 0 1996-06-26 <NA> 1996-07-01 1996-07-31 1.9
## 2 2 0 1996-07-30 <NA> 1996-08-01 1996-08-31 1.9
## 3 3 0 1996-08-21 <NA> 1996-09-01 1996-09-30 1.88
## 4 4 0 1996-09-23 <NA> 1996-10-01 1996-10-31 1.82
## 5 5 0 1996-10-23 <NA> 1996-11-01 1996-11-30 1.78
## 6 6 0 1996-11-27 <NA> 1996-12-01 1996-12-31 1.74
5.9 Ibovespa e selic
Apresentando gráficamente as duas séries:
grid.arrange(bov_plot, selic_plot, ncol=2)
Elas seguem tendências opostas, indicando uma correlação negativa, o que aparentemente sustenta a hipotese de correlação entre as séries.
5.10 Unindo os conjuntos de dados
Os conjuntos de dados do índice ibovespa será aumentado com os conjuntos de dados da meta selic e com as reuniões do COPOM.
# Usando apenas valor ajustado
df_bvsp_close <- df_bvsp$df.tickers %>%
dplyr::select(ref.date, price.adjusted)
df_bvsp_selic <- merge(df_bvsp_close, df_selic_meta, by = 'ref.date', all.x = T)
df_bvsp_selic <- merge(df_bvsp_selic, df_selic_focus, by = 'ref.date', all.x = T)
df_bvsp_selic <- df_bvsp_selic %>%
fill(c(selic.tax, ref.year, `min`, `max`), .direction = "downup")
df_bvsp_selic$diff.meta.max = with(df_bvsp_selic, max - selic.tax)
df_bvsp_selic <- merge(df_bvsp_selic, df_reuniao_copom, by = 'ref.date', all.x = T)
df_bvsp_selic <- df_bvsp_selic %>%
fill(c(decision.target, meeting.number, term.start, term.end), .direction = "downup")
round(stat.desc(df_bvsp_selic))## ref.date price.adjusted selic.tax ref.year min max respondents
## nbr.val 5578 5578 5578 NA 5578 5578 2409
## nbr.null 0 0 0 NA 0 0 0
## nbr.na 0 0 0 NA 0 0 3169
## min 11675 8371 2 NA 1 2 22
## max 19320 130776 14 NA 22 27 137
## range 7645 122405 12 NA 21 25 115
## sum 87846608 351263219 45310 NA 57505 70250 239976
## median 15796 58406 7 NA 10 13 104
## mean 15749 62973 8 NA 10 13 100
## SE.mean 31 422 0 NA 0 0 0
## CI.mean.0.95 61 827 0 NA 0 0 1
## var 5357435 992505261 8 NA 16 22 437
## std.dev 2315 31504 3 NA 4 5 21
## coef.var 0 1 0 NA 0 0 0
## diff.meta.max meeting.number extra note term.start term.end
## nbr.val 5578 5578 198 NA 5578 5578
## nbr.null 386 0 197 NA 0 0
## nbr.na 0 0 5380 NA 0 0
## min -2 66 0 NA 11676 11710
## max 20 250 1 NA 19292 19333
## range 22 184 1 NA 7616 7623
## sum 24940 950951 1 NA 87734996 87971230
## median 3 173 0 NA 15771 15812
## mean 4 170 0 NA 15729 15771
## SE.mean 0 1 0 NA 31 31
## CI.mean.0.95 0 1 0 NA 61 61
## var 21 2813 0 NA 5347621 5366735
## std.dev 5 53 0 NA 2312 2317
## coef.var 1 0 14 NA 0 0
## decision.target
## nbr.val 5578
## nbr.null 0
## nbr.na 0
## min 2
## max 26
## range 24
## sum 64945
## median 11
## mean 12
## SE.mean 0
## CI.mean.0.95 0
## var 26
## std.dev 5
## coef.var 0
gf_point(price.adjusted ~ selic.tax, color = ~ selic.tax, size = ~ price.adjusted, alpha = 0.50, data = df_bvsp_selic) + scale_y_continuous(labels = label_comma())
O preço ibovespa ajutado explicado pela taxa selic parece seguir a tendência observada nos gráficos anteriores, quanto menor a taxa, maior é o preço ajustado.
df_not_expected <- df_bvsp_selic[order(-df_bvsp_selic$meeting.number), ] %>%
filter(!is.na(meeting.number) & diff.meta.max < 0) %>%
select(meeting.number, ref.date, diff.meta.max, price.adjusted) %>%
group_by(meeting.number) %>%
slice(which.min(ref.date))
df_not_expected## # A tibble: 14 × 4
## # Groups: meeting.number [14]
## meeting.number ref.date diff.meta.max price.adjusted
## <dbl> <date> <dbl> <dbl>
## 1 202 2016-11-18 -0.25 59962
## 2 203 2017-01-02 -2 59589
## 3 204 2017-01-11 -2 62446
## 4 205 2017-02-22 -2.25 68590
## 5 206 2017-04-12 -2.25 63892
## 6 207 2017-05-31 -1.5 62711
## 7 208 2017-07-26 -1 65011
## 8 209 2017-09-06 -0.5 73412
## 9 210 2017-11-03 -0.25 73915
## 10 211 2017-12-06 -0.5 73268
## 11 224 2019-09-02 -0.5 100626
## 12 225 2019-09-18 -0.5 104532
## 13 230 2020-06-03 -0.25 93002
## 14 231 2020-06-17 -0.5 95547
log.retorno = diff(log(df_bvsp_selic$price.adjusted))
log.retorno[length(log.retorno) + 1] = 0
gf_point(log.retorno ~ diff.meta.max, color = ~ diff.meta.max, alpha = 0.50, data = df_bvsp_selic) + scale_y_continuous(labels = label_comma())
De acordo com o gráfico acima, o log retorno do preço ajustado das ações não parece ser influenciado pela diferença da meta vs o máximo esperado. Pela hipótese de que a surpresa faria o índice bovespa recuar, quanto menor a diferença, menor deveria ser o retorno, o que não foi observado.
temp <- df_bvsp_selic[order(-df_bvsp_selic$meeting.number), ] %>%
filter(!is.na(meeting.number)) %>%
select(ref.date, diff.meta.max)
ggplot(temp, aes(x = ref.date, y = diff.meta.max))+
geom_line()+
labs(title='Variação expectativa meta vs focus',
caption='Fonte: autor.')+
geom_line() +
geom_smooth(method = "loess", se = FALSE)+
theme(axis.text.x = element_text(angle = 90))+
geom_line(aes(y = 0), color = "red", linetype = "dotted")
Reuniões cuja a meta foi superior ao máximo esparado pelos respondentes da pesquisa focus.
temp %>%
filter(diff.meta.max < 0)## ref.date diff.meta.max
## 1 2020-06-17 -0.50
## 2 2020-06-03 -0.25
## 3 2020-06-04 -0.25
## 4 2020-06-05 -0.25
## 5 2020-06-08 -0.25
## 6 2020-06-09 -0.25
## 7 2020-06-10 -0.25
## 8 2020-06-12 -0.50
## 9 2020-06-15 -0.50
## 10 2020-06-16 -0.50
## 11 2019-09-18 -0.50
## 12 2019-09-02 -0.50
## 13 2019-09-03 -0.50
## 14 2019-09-04 -0.50
## 15 2019-09-05 -0.50
## 16 2019-09-06 -0.50
## 17 2019-09-09 -0.50
## 18 2019-09-10 -0.50
## 19 2019-09-11 -0.50
## 20 2019-09-12 -0.50
## 21 2019-09-13 -0.50
## 22 2019-09-16 -0.50
## 23 2019-09-17 -0.50
## 24 2017-12-06 -0.50
## 25 2017-11-03 -0.25
## 26 2017-11-06 -0.25
## 27 2017-11-07 -0.25
## 28 2017-11-08 -0.25
## 29 2017-11-09 -0.25
## 30 2017-11-10 -0.25
## 31 2017-11-13 -0.25
## 32 2017-11-14 -0.25
## 33 2017-11-16 -0.25
## 34 2017-11-17 -0.25
## 35 2017-11-21 -0.25
## 36 2017-11-22 -0.25
## 37 2017-11-23 -0.50
## 38 2017-11-24 -0.50
## 39 2017-11-27 -0.50
## 40 2017-11-28 -0.50
## 41 2017-11-29 -0.50
## 42 2017-11-30 -0.50
## 43 2017-12-01 -0.50
## 44 2017-12-04 -0.50
## 45 2017-12-05 -0.50
## 46 2017-09-06 -0.50
## 47 2017-07-26 -1.00
## 48 2017-07-31 -0.50
## 49 2017-08-01 -0.50
## 50 2017-08-02 -0.50
## 51 2017-08-03 -0.50
## 52 2017-08-04 -0.50
## 53 2017-08-07 -0.75
## 54 2017-08-08 -0.75
## 55 2017-08-09 -0.75
## 56 2017-08-10 -0.75
## 57 2017-08-11 -0.75
## 58 2017-08-14 -0.75
## 59 2017-08-15 -0.75
## 60 2017-08-16 -0.75
## 61 2017-08-17 -0.75
## 62 2017-08-18 -0.75
## 63 2017-08-21 -0.50
## 64 2017-08-22 -0.50
## 65 2017-08-23 -0.50
## 66 2017-08-24 -0.50
## 67 2017-08-25 -0.50
## 68 2017-08-28 -0.50
## 69 2017-08-29 -0.50
## 70 2017-08-30 -0.50
## 71 2017-08-31 -0.50
## 72 2017-09-01 -0.50
## 73 2017-09-04 -0.50
## 74 2017-09-05 -0.50
## 75 2017-05-31 -1.50
## 76 2017-06-01 -0.50
## 77 2017-06-02 -0.50
## 78 2017-06-05 -0.50
## 79 2017-06-06 -0.50
## 80 2017-06-07 -0.50
## 81 2017-06-08 -0.50
## 82 2017-06-09 -0.50
## 83 2017-06-12 -0.50
## 84 2017-06-13 -0.50
## 85 2017-06-14 -0.50
## 86 2017-06-16 -0.50
## 87 2017-06-19 -0.50
## 88 2017-06-20 -0.50
## 89 2017-06-21 -0.50
## 90 2017-06-22 -0.50
## 91 2017-06-23 -0.50
## 92 2017-06-26 -0.50
## 93 2017-06-27 -0.50
## 94 2017-06-28 -0.50
## 95 2017-06-29 -0.50
## 96 2017-06-30 -0.50
## 97 2017-07-03 -0.75
## 98 2017-07-04 -0.75
## 99 2017-07-05 -0.75
## 100 2017-07-06 -0.75
## 101 2017-07-07 -0.75
## 102 2017-07-10 -0.75
## 103 2017-07-11 -0.75
## 104 2017-07-12 -0.75
## 105 2017-07-13 -0.75
## 106 2017-07-14 -0.75
## 107 2017-07-17 -0.75
## 108 2017-07-18 -0.75
## 109 2017-07-19 -0.75
## 110 2017-07-20 -0.75
## 111 2017-07-21 -1.00
## 112 2017-07-24 -1.00
## 113 2017-07-25 -1.00
## 114 2017-04-12 -2.25
## 115 2017-04-13 -1.25
## 116 2017-04-17 -1.25
## 117 2017-04-18 -1.25
## 118 2017-04-19 -1.50
## 119 2017-04-20 -1.50
## 120 2017-04-24 -1.50
## 121 2017-04-25 -1.50
## 122 2017-04-26 -1.50
## 123 2017-04-27 -1.50
## 124 2017-04-28 -1.50
## 125 2017-05-02 -1.50
## 126 2017-05-03 -1.50
## 127 2017-05-04 -1.75
## 128 2017-05-05 -1.75
## 129 2017-05-08 -1.75
## 130 2017-05-09 -1.75
## 131 2017-05-10 -1.75
## 132 2017-05-11 -1.75
## 133 2017-05-12 -1.75
## 134 2017-05-15 -1.75
## 135 2017-05-16 -1.75
## 136 2017-05-17 -1.75
## 137 2017-05-23 -0.75
## 138 2017-05-24 -0.75
## 139 2017-05-25 -0.75
## 140 2017-05-26 -1.50
## 141 2017-05-29 -1.50
## 142 2017-05-30 -1.50
## 143 2017-02-22 -2.25
## 144 2017-02-23 -1.50
## 145 2017-02-24 -1.50
## 146 2017-03-01 -1.50
## 147 2017-03-02 -1.50
## 148 2017-03-03 -1.50
## 149 2017-03-06 -1.50
## 150 2017-03-07 -1.50
## 151 2017-03-08 -1.50
## 152 2017-03-09 -1.50
## 153 2017-03-10 -1.50
## 154 2017-03-13 -1.50
## 155 2017-03-14 -1.50
## 156 2017-03-15 -1.50
## 157 2017-03-16 -1.50
## 158 2017-03-17 -1.50
## 159 2017-03-20 -1.50
## 160 2017-03-21 -1.50
## 161 2017-03-22 -1.50
## 162 2017-03-23 -2.00
## 163 2017-03-24 -2.00
## 164 2017-03-27 -2.00
## 165 2017-03-28 -2.00
## 166 2017-03-29 -2.00
## 167 2017-03-30 -2.00
## 168 2017-03-31 -2.00
## 169 2017-04-03 -2.25
## 170 2017-04-04 -2.25
## 171 2017-04-05 -2.25
## 172 2017-04-06 -2.25
## 173 2017-04-07 -2.25
## 174 2017-04-10 -2.25
## 175 2017-04-11 -2.25
## 176 2017-01-11 -2.00
## 177 2017-01-12 -1.50
## 178 2017-01-13 -1.50
## 179 2017-01-16 -2.00
## 180 2017-01-17 -2.00
## 181 2017-01-18 -2.00
## 182 2017-01-19 -2.00
## 183 2017-01-20 -2.00
## 184 2017-01-23 -2.00
## 185 2017-01-24 -2.00
## 186 2017-01-26 -2.00
## 187 2017-01-27 -2.00
## 188 2017-01-30 -2.00
## 189 2017-01-31 -2.00
## 190 2017-02-01 -2.00
## 191 2017-02-02 -2.00
## 192 2017-02-03 -2.00
## 193 2017-02-06 -2.25
## 194 2017-02-07 -2.25
## 195 2017-02-08 -2.25
## 196 2017-02-09 -2.25
## 197 2017-02-10 -2.25
## 198 2017-02-13 -2.41
## 199 2017-02-14 -2.41
## 200 2017-02-15 -2.41
## 201 2017-02-16 -2.41
## 202 2017-02-17 -2.41
## 203 2017-02-20 -2.25
## 204 2017-02-21 -2.25
## 205 2017-01-02 -2.00
## 206 2017-01-03 -2.00
## 207 2017-01-04 -2.00
## 208 2017-01-05 -2.00
## 209 2017-01-06 -2.00
## 210 2017-01-09 -2.00
## 211 2017-01-10 -2.00
## 212 2016-11-18 -0.25
## 213 2016-11-21 -0.25
Retorno sobre o preço ajustado do ibovespa entre as reuniões do copom.
ts_temp <- xts(temp[,-1], order.by=as.Date(temp[,1], "%Y-%m-%d"))
names(ts_temp) <- "price.adjusted"
ret_simples <- diff(log(ts_temp$price.adjusted))
ggplot(ret_simples, aes(x = Index, y = price.adjusted))+
geom_line()+
labs(title=glue::glue('Ibovespa na data das reuniões'),
caption='Fonte: autor.')+
geom_line() +
geom_smooth(method = "loess", se = FALSE)+
theme(axis.text.x = element_text(angle = 90))
Computando o log retorno entre as datas das reuniões do COPOM e o preço ajustado, não há uma tendência explícita, sendo que os ganhos de (log retorno maior que zero) superam as perdas (-). Totalizando um retorno de NA.
5.11 Preço ibovespa ajustado antes e depois da reunião
offset <- 10Preço Ibovespa ajustado 10 dias antes e depois da reunião do copom.
meeting_eval <- data.frame(matrix(ncol = 4, nrow = 0))
colnames(meeting_eval) <- c('meeting.date', 'period.start', 'period.end', 'return')
for (row in 1:nrow(df_not_expected)) {
meeting_date = df_not_expected[row, ]$ref.date
start = meeting_date - offset
end = meeting_date + offset
temp <- df_bvsp_selic %>%
filter(ref.date >= start & ref.date <= end) %>%
select(ref.date, price.adjusted)
ret_simples <- diff(log(temp$price.adjusted))
# Adiciona as métricas no df
meeting_eval[nrow(meeting_eval) + 1, ] <- list(meeting_date, start, end, sum(ret_simples))
print(ggplot(temp, aes(x = ref.date, y = price.adjusted))+
geom_line()+
labs(title=glue::glue('Variação preço fechamento -{offset}d, reunião de {meeting_date}, +{offset}d'),
caption='Fonte: autor.')+
geom_line() +
geom_smooth(method = "loess", se = FALSE)+
theme(axis.text.x = element_text(angle = 90))+
geom_line(aes(x = meeting_date), color = "red", linetype = "dotted"))
}













meeting_eval$period.start <- as.Date(meeting_eval$period.start)
meeting_eval$period.end = as.Date(meeting_eval$period.end)
meeting_eval$meeting.date = as.Date(meeting_eval$meeting.date)
meeting_eval## meeting.date period.start period.end return
## 1 2016-11-18 2016-11-08 2016-11-28 -0.020518305
## 2 2017-01-02 2016-12-23 2017-01-12 0.098807862
## 3 2017-01-11 2017-01-01 2017-01-21 0.079519759
## 4 2017-02-22 2017-02-12 2017-03-04 -0.002721416
## 5 2017-04-12 2017-04-02 2017-04-22 -0.022486448
## 6 2017-05-31 2017-05-21 2017-06-10 0.008685599
## 7 2017-07-26 2017-07-16 2017-08-05 0.025525570
## 8 2017-09-06 2017-08-27 2017-09-16 0.064611564
## 9 2017-11-03 2017-10-24 2017-11-13 -0.052086357
## 10 2017-12-06 2017-11-26 2017-12-16 -0.019786964
## 11 2019-09-02 2019-08-23 2019-09-12 0.066388126
## 12 2019-09-18 2019-09-08 2019-09-28 0.018218204
## 13 2020-06-03 2020-05-24 2020-06-13 0.079971765
## 14 2020-06-17 2020-06-07 2020-06-27 -0.039811189
positive_return = meeting_eval %>% filter(return > 0) %>% pull(return) %>% sum
negative_return = meeting_eval %>% filter(return < 0) %>% pull(return) %>% sum
overall_return = sum(meeting_eval$return)
count_positive_return = meeting_eval %>% filter(return > 0) %>% count
count_negative_return = meeting_eval %>% filter(return < 0) %>% count
count_overall_return = count(meeting_eval)Avaliando o retorno nos períodos 10 dias antes e depois das reuniões, as perdas foram de -0.1574107 e os ganhos 0.4417284, gerando um acumulado de 0.2843178. Embora em cerca de 6 das amostra houve um retorno negativo, isso representa 0.43% das amostras.
5.12 Salvando o conjunto de dados
# antes de proceder com o restante do exercicio, vamos salvar o dataset para
# o usar nos proximos modulos
write_rds(df_bvsp_selic, "../dados/df_bvsp_selic.rds")5.13 Correlação ibovespa e selic
Comparando o índice ibovespa e a selic, percebemos que há uma relação, inversa, entre as duas séries.
bvsp_norm <- sd(df_bvsp_selic$price.adjusted, na.rm=TRUE)
selic_norm <- sd(df_bvsp_selic$selic.tax, na.rm=TRUE)
df_bvsp_selic$price.adjusted.norm <- log(df_bvsp_selic$price.adjusted)
df_bvsp_selic$selic.tax.norm <- log(df_bvsp_selic$selic.tax)
ggplot(df_bvsp_selic, aes(x=ref.date)) +
geom_line(aes(y=price.adjusted.norm), size=2, color="blue", na.rm=TRUE, alpha=.6) +
stat_smooth(size=2, aes(y=price.adjusted.norm), color="green", size=1) +
geom_line(aes(y=selic.tax.norm), size=2, color="red", na.rm=TRUE, alpha=.6) +
stat_smooth(size=2, aes(y=selic.tax.norm), color = "green") +
scale_y_continuous(
# Features of the first axis
name = "bvsp",
# Add a second axis and specify its features
sec.axis = sec_axis(~./selic_norm, name="selic")
) +
#ggtitle("Ibovespa vs Selic") +
labs(title = "Ibovespa vs Selic",
subtitle = 'Relação entre ativos e indicadores macroeconomicos',
x = 'Anos',
fill = '') 
Avaliando a correlação cruzada (CCF - Cross Correlation Function) para toda a série, temos:
# https://www.lobdata.com.br/2020/09/15/how-to-perform-correlation-analysis-in-time-series-data-using-r/
df_bvsp_selic_long <- df_bvsp_selic %>%
pivot_longer(cols = c(price.adjusted, selic.tax), names_to = "names", values_to = "value")df_bvsp_selic_long %>%
plot_time_series(.date_var = ref.date,
.value = value,
.facet_vars = names)As séries tem comportamento muito próximo no tempo.
# CCF plot
df_bvsp_selic_long %>%
plot_acf_diagnostics(.date_var = ref.date,
.value = price.adjusted.norm,
.ccf_vars = selic.tax.norm,
.show_ccf_vars_only = T)E todas as correlações são negativas.
correlation <- cor(df_bvsp_selic$price.adjusted, df_bvsp_selic$selic.tax, method = c("pearson"))Indicando que há uma relação inversa e forte, como indicado pelo coeficiente de Pearson de -0.1082102,
Teste correlação
cor.test(df_bvsp_selic$price.adjusted, df_bvsp_selic$selic.tax, method=c("pearson"))##
## Pearson's product-moment correlation
##
## data: df_bvsp_selic$price.adjusted and df_bvsp_selic$selic.tax
## t = -8.1281, df = 5576, p-value = 5.328e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.13407325 -0.08219993
## sample estimates:
## cor
## -0.1082102
Outra forma de exibir a correlação entre ibovespa e selic. A relação foi calculada tanto para o valor nominal, quanto para seus respectivos logs.
ggcorr(df_bvsp_selic %>% select(price.adjusted, selic.tax, price.adjusted.norm, selic.tax.norm), method = c("pairwise", "pearson"), label = TRUE, label_alpha = TRUE) 
A próxima seção avalia a correlação entre as séries em períodos distintos da história econômica.
5.13.1 Crise dos Subprime
Avaliando para o período de 2004 a 2007: período de início da redução de juros até a crise dos Subprime:
start_date = '2004-01-01'
end_date = '2007-12-31'
df_bvsp_selic_long %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
plot_time_series(.date_var = ref.date,
.value = value,
.facet_vars = names)correlation = df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor(price.adjusted, selic.tax, method = c("pearson")))## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation## [1] NA
Teste correlação
df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor.test(price.adjusted, selic.tax, method=c("pearson")))## Warning in cor(x, y): o desvio padrão é zero
##
## Pearson's product-moment correlation
##
## data: price.adjusted and selic.tax
## t = NA, df = 503, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## NA NA
## sample estimates:
## cor
## NA
period_eval[nrow(period_eval) + 1, ] <- list("Crise dos subprime", start_date, end_date, correlation)5.13.2 Crise financeira mundial
No período de 2008 a 2010 houve o auge da crise financeira mundial no Brasil até a fase de recuperação do mercado.
start_date = '2008-01-01'
end_date = '2010-12-31'
df_bvsp_selic_long %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
plot_time_series(.date_var = ref.date,
.value = value,
.facet_vars = names)correlation = df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor(price.adjusted, selic.tax, method = c("pearson")))## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation## [1] NA
Teste correlação
df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor.test(price.adjusted, selic.tax, method=c("pearson")))## Warning in cor(x, y): o desvio padrão é zero
##
## Pearson's product-moment correlation
##
## data: price.adjusted and selic.tax
## t = NA, df = 1492, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## NA NA
## sample estimates:
## cor
## NA
period_eval[nrow(period_eval) + 1, ] <- list("Crise financeira mundial", start_date, end_date, correlation)5.13.3 Crise financeira Europa
De 2011 a 2012 foi o período que inclui tendência de redução da taxa básica de juros e a crise financeira, iniciada na Europa em 2011.
start_date = '2011-01-01'
end_date = '2012-12-31'
df_bvsp_selic_long %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
plot_time_series(.date_var = ref.date,
.value = value,
.facet_vars = names)correlation = df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor(price.adjusted, selic.tax, method = c("pearson")))## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation## [1] NA
Teste correlação
df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor.test(price.adjusted, selic.tax, method=c("pearson")))## Warning in cor(x, y): o desvio padrão é zero
##
## Pearson's product-moment correlation
##
## data: price.adjusted and selic.tax
## t = NA, df = 2234, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## NA NA
## sample estimates:
## cor
## NA
period_eval[nrow(period_eval) + 1, ] <- list("Crise financeira Europa", start_date, end_date, correlation)5.13.4 Grande recessão brasileira
No período de 2013 a 2016 houve a crise econômica de 2014, conhecida como a “grande recessão brasileira”, foi uma profunda e duradoura crise econômica, sendo caracterizada por recessão por dois anos consecutivos (2015 e 2016) e por sua longa e lenta recuperação, a mais lenta da história do país. (WIKIPEDIA, 2022).
start_date = '2013-01-01'
end_date = '2016-12-31'
df_bvsp_selic_long %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
plot_time_series(.date_var = ref.date,
.value = value,
.facet_vars = names)correlation = df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor(price.adjusted, selic.tax, method = c("pearson")))## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation## [1] NA
Teste correlação
df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor.test(price.adjusted, selic.tax, method=c("pearson")))## Warning in cor(x, y): o desvio padrão é zero
##
## Pearson's product-moment correlation
##
## data: price.adjusted and selic.tax
## t = NA, df = 2727, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## NA NA
## sample estimates:
## cor
## NA
period_eval[nrow(period_eval) + 1, ] <- list("Grande recessão brasileira", start_date, end_date, correlation)5.13.5 COVID-19
Mais recente, o período de 2017 a 2022 inclue os efeitos da COVID-19, iniciada em 2020.
start_date = '2017-01-01'
end_date = '2022-12-31'
df_bvsp_selic_long %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
plot_time_series(.date_var = ref.date,
.value = value,
.facet_vars = names)correlation = df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor(price.adjusted, selic.tax, method = c("pearson")))
correlation## [1] 0.2006021
Teste correlação
df_bvsp_selic %>%
filter(ref.date <= start_date & ref.date <= end_date) %>%
with(cor.test(price.adjusted, selic.tax, method=c("pearson")))##
## Pearson's product-moment correlation
##
## data: price.adjusted and selic.tax
## t = 12.486, df = 3718, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.1695585 0.2312481
## sample estimates:
## cor
## 0.2006021
period_eval[nrow(period_eval) + 1, ] <- list("COVID-19", start_date, end_date, correlation)5.13.6 Resumo
period_eval## period_name period.start period.end cor-pearson
## 1 Crise dos subprime 2004-01-01 2007-12-31 NA
## 2 Crise financeira mundial 2008-01-01 2010-12-31 NA
## 3 Crise financeira Europa 2011-01-01 2012-12-31 NA
## 4 Grande recessão brasileira 2013-01-01 2016-12-31 NA
## 5 COVID-19 2017-01-01 2022-12-31 0.2006021
5.14 Conclusão
A hipótese de que Ibovespa é influenciado pela taxa Selic foi testada e há indícios que existe uma forte correlação, como demonstrado no quadro resumo. Ao avaliar toda a série, encontramos coeficientes de correlação superiores a \(0,8\), porém, quando analisamos os retornos do índice próximos as decisões do COPOM, os resultados não indicam uma tendência, sendo que apróximadamente \(50%\) das vezes as decisões consideradas surpresa afetaram negativamente e positivamente e o acumulado dos retornos para esses períodos foi positivo.
É de opinião deste autor, que com base nos dados obtidos, existe uma correlação forte entre a Selic e o Ibovespa, porém, essa relação não necessáriamente é unilateral ou exclusiva, podendo outros indicadores macroeconomicos e fatores sócio-economicos influenciarem ambas as séries e suas relações.
Como trabalho futuro, revisar a forma como a surpresa do mercado é calculada, seguindo o modelo usado por Gonçalves Junior (2007) e incluir outros indicadores macroeconomicos, como utilizados por De Souza Grôppo (2005).
5.15 Referências
CASTRO, F. Henrique et al. Fifty-year History of the Ibovespa. Brazilian Review of Finance, v. 17, n. 3, p. 47-65, 2019.
DE SOUZA GRÔPPO, Gustavo. Co-integração e causalidade entre variáveis de política monetária e Ibovespa. Revista de Economia e Administração, v. 4, n. 2, 2005.
DOS SANTOS, Fernando Siqueira; PRADO, Roberto RA. Causalidade Selic-Ibovespa revisada. Revista de Economia e Administração, v. 5, n. 1, 2006.
GONÇALVES JUNIOR, Walter. Surpresas com relação à política monetária e o mercado de capitais: Evidências do caso brasileiro. 2007. Tese de Doutorado.
LUCAS, Robert E.; SARGENT, Thomas. After Keynesian Macroeconomics. In: Miller, P. J. (org.) The Rational Expectations Revolutions: Readings from the Front Line. [S.1]: Massachussetts Institute of Technology, p.05-30, 1996.
YOSHIDA, Olga Satomi. BIGDATA ANALITYCS: data 22-11-2022. São Paulo: Instituto de Pesquisas Tecnológicas do Estado de São Paulo, 2022. 4 slides, color.
WIKIPEDIA. Lista de crises econômicas no Brasil. Disponível em: https://pt.wikipedia.org/wiki/Lista_de_crises_econ%C3%B4micas_no_Brasil. Acesso em: 03 dez. 2022.